(function() {
	$('#create-location').live('pageinit', function(event) {
		var $this = $(this);
		$this.find('.address-selector').addressSelector();
		$this.find('.ajax-form').ajaxForm({
			successCallback : function(){
				setTimeout(function(){
					$.mobile.showNotification("등록되었습니다. 입력하신 주소나 이름으로 다시 검색해 보세요.");
				}, 1000);
			}
		});
	});
	
	$('#create-location').live('pagebeforeshow', function(event) {
		LOC.init();
	});
	
	var map;
	var LOC = $.LOC = {
		initialized: false,
		timeOut: null,
		$page : null,
		map : null,
		geocoder: null,
		marker: null,
		circle: null,
		latLng: null,
		fakeAddrSelect: false,
		
		init : function(){
			this.$page = $('#create-location');
			if(navigator.geolocation) {
				$.mobile.showNotification('현재 위치 정보를 탐색합니다.');
				navigator.geolocation.getCurrentPosition(
					this.initMap, 
					this.geoError,
					{timeout:5000, maximumAge: 60000}
				);
				LOC.timeOut = setTimeout(this.initMap, 5000);
			} else {
				$.mobile.showNotification('위치 탐색을 지원하지 않는 브라우저입니다. 기본값으로 지도를 초기화합니다.');
				this.initMap();
			}
		},
		
		geoError : function(status){
			$.mobile.showNotification('현재 위치 탐색에 실패했습니다. 기본값으로 지도를 초기화합니다.');
			LOC.initMap();
		},
		
		initMap: function(pos){
			if(LOC.timeOut)
				clearInterval(LOC.timeOut);
			
			var pos = $.extend({coords:{latitude: 37.565603, longitude:126.940498}}, pos);
			var latlng = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude)
			
			var myOptions = {
				zoom : 14,
				center: latlng,
				mapTypeControl : false,
				streetViewControl: false,
				draggable: true,
				navigationControlOptions : {
					style : google.maps.NavigationControlStyle.SMALL
				},
				mapTypeId : google.maps.MapTypeId.ROADMAP
			};
			
			if(LOC.initialized && LOC.$page.find("#map-canvas").text() != '')
				LOC.map.setOptions(myOptions);
			else
				LOC.map = new google.maps.Map(LOC.$page.find("#map-canvas").get(0), myOptions);
			
			var markerOptions = {
				position : latlng,
				title : '위치',
				map : LOC.map,
				draggable: true
			};
			
			var circleOptions = {
				center: latlng,
				radius: 500,
				map: LOC.map
			};
			
			if(LOC.initialized){
				LOC.marker.setOptions(markerOptions);
				LOC.circle.setOptions(circleOptions);
			}else{
				LOC.marker = new google.maps.Marker(markerOptions);
				LOC.circle = new google.maps.Circle(circleOptions);
				LOC.geocoder = new google.maps.Geocoder();
				LOC.$page.find('.address-selector select').change(LOC.setMarkerFromAddress);
				LOC.$page.find('#radius').change(LOC.setRadiusFromText);
				google.maps.event.addListener(LOC.marker, "dragend", function() {
					var markerPosition = LOC.marker.getPosition()
					LOC.updateMarkerPosition(markerPosition);
					LOC.geocodePosition(markerPosition);
					
				});
				LOC.initialized = true;
			}
			
			LOC.updateMarkerPosition(latlng);
			LOC.geocodePosition(latlng);
			
			$.mobile.showNotification("지도의 표시를 끌어서 자세한 위치를 정하실 수 있습니다.");
			$('body').prop('scrollTop', LOC.$page.find('.address-selector').offset().top);
			
			$('#address').focus(function(){$(this).blur()});
		},
		
		/**
		 * 주소 목록에서 선택된 위치로 전체 좌표 이동
		 */
		setMarkerFromAddress: function(event){
			if(LOC.fakeAddrSelect === true)
			{
				LOC.fakeAddrSelect = false;
				return;
			}
			
			var $this = $(this);	
			var $opt = $this.find('option:selected');
			var coords = $opt.data('coords');
			var latlng = new google.maps.LatLng(coords.lat, coords.lng);
			
			LOC.marker.setPosition(latlng);
			LOC.map.setCenter(latlng);
			LOC.updateMarkerPosition(latlng);
			
			var str = '';
			var level = $this.attr('id').substr(-1);
			LOC.$page.find('.address-selector select:lt('+level+')').each(function(idx){
				var $this = $(this);
				var val = $(this).val();
				if (val != '')
					str += $this.find('option:selected').text() + ' ';
			});
			$('#address').val(str);
			$("#address_str").html(str);
		},
		
		/**
		 * Google Maps 좌표 받아서 주소로 역 지오코딩
		 */
		geocodePosition: function(pos) {
			$.mobile.showPageLoadingMsg();
			
			LOC.geocoder.geocode({
				latLng : pos,
				language : 'ko',
				region: 'kr'
			}, function(responses) {
				if(responses && responses.length > 0) {
					LOC.updateMarkerAddress(responses[0]);
				} else {
					LOC.updateMarkerAddress();
				}
			});
		},

		/**
		 * 역 지오코딩 결과를 주소로 변환
		 */
		updateMarkerAddress: function(result) {
			var str;
			
			if(typeof result === 'undefined'){
				str = '선택하신 위치의 주소를 찾을 수 없습니다.';
				$('#address').val(str);
				$.mobile.hidePageLoadingMsg();
			}else{
				str = convertFormattedAddress(result.formatted_address);
				
				/**
				 * Google Geocode 결과를 내부 주소 ID로 변환
				 */
				$.ajax({
					type : 'post',
					url : CI_ROOT + "ajax/convert_address_components",
					data : {
						address_components : result.address_components
					},
					success : function(res) {
						if(res.status == 'ok'){
							LOC.$page.find('#address').val(str);
							LOC.updateAddressSelectorFromIds(res.data);
						}else{
							LOC.$page.find('#address').val(str);
							$.mobile.showNotification(res.message || '서버와 통신 중 장애가 발생했습니다.');
						}
					},
					error : function(res) {
						$.mobile.showNotification('서버와 통신 중 장애가 발생했습니다.');
					},
					complete : function(res) {
						$.mobile.hidePageLoadingMsg();
					}
				});
			}
	    },
		
		updateMarkerPosition: function(latlng) {
	        LOC.$page.find('#lat').val(latlng.lat().toFixed(6));
	        LOC.$page.find('#lng').val(latlng.lng().toFixed(6));
	        LOC.circle.setCenter(latlng);
	    },
	    
	    /*
	     *  ID 목록을 받아서 주소 선택기 업데이트
	     */
	    updateAddressSelectorFromIds : function(data){
	    	var $selectors = LOC.$page.find('.address-selector select');
	    	var i = 0;
	    	for(var id in data){
	    		$.addressSelectorCache[id] = $.addressSelectorCache[id] || data[id];
	    		LOC.fakeAddrSelect = true;
	    		$selectors.eq(i++).val(id).trigger('change').selectmenu('refresh');
	    	}
	    	LOC.fakeAddrSelect = false;
	    },
	    	
	    setRadiusFromText: function(latlng){
	    	var $this = $(this);
	    	var val = $this.val();
	    	var error = false;
	    	if( ! $.isNumeric(val) ){
	    		$.mobile.showNotification("반경은 정수여야 합니다.");
	    		error = true;
	    	}else if(val < 10){
	    		$.mobile.showNotification("반경은 10미터보다 작을 수 없습니다.");
	    		error = true;
	    	}else if(val > 3000){
	    		$.mobile.showNotification("반경은 3킬로미터를 초과할 수 없습니다.");
	    		error = true;
	    	}
	    	
	    	if(error){
	    		$this.focus();
	    		return false;
	    	}
	    	
	    	LOC.circle.setRadius(+val);
	    }
	};
	
	function convertFormattedAddress(addr){
		return addr.replace('대한민국 ', '').replace(/광역시|특별시/,'시').replace(/\d(동|리)([\s ]|$)/, "$1$2");
	}
})();
